ãžã§ããªãã¯åæšè«ããã®ã¡ã«ããºã ãå©ç¹ãããã³å€æ§ãªããã°ã©ãã³ã°èšèªããã©ãã€ã ã§ã®å¿çšãå æ¬çã«æ¢æ±ããèªåå解決ãšã³ãŒãå¹çã®åäžã«çŠç¹ãåœãŠãŸãã
ãžã§ããªãã¯åæšè«ã®è§£æïŒèªåå解決ã¡ã«ããºã
ãžã§ããªãã¯åæšè«ã¯ãã³ãŒããç°¡çŽ åããåå®å šæ§ãåäžããããçŸä»£ã®ããã°ã©ãã³ã°èšèªã«ããã匷åãªæ©èœã§ããã³ã³ãã€ã©ãããžã§ããªãã¯ãã©ã¡ãŒã¿ã䜿çšãããŠããã³ã³ããã¹ãã«åºã¥ããŠãã®åãèªåçã«æšæž¬ã§ããããã«ããæç€ºçãªå泚éã®å¿ èŠæ§ãæžãããã³ãŒãã®å¯èªæ§ãåäžãããŸãã
ãžã§ããªãã¯åæšè«ãšã¯ïŒ
ãã®æ žå¿ã«ãããŠããžã§ããªãã¯åæšè«ã¯èªåå解決ã¡ã«ããºã ã§ãããžã§ããªã¯ã¹ïŒãã©ã¡ããªãã¯å€çžæ§ãšãåŒã°ããïŒã¯ãç¹å®ã®åã«äŸåããããšãªããããŸããŸãªåã§åäœããã³ãŒããæžãããšãå¯èœã«ããŸããããšãã°ãæŽæ°ãæååããŸãã¯ãã®ä»ã®ããŒã¿åãæ ŒçŽã§ãããžã§ããªãã¯ãªã¹ããäœæã§ããŸãã
åæšè«ããªãå Žåããžã§ããªãã¯ã¯ã©ã¹ãŸãã¯ã¡ãœããã䜿çšããéã«åãã©ã¡ãŒã¿ãæç€ºçã«æå®ããå¿ èŠããããŸããããã¯ãç¹ã«è€éãªåéå±€ãæ±ãå Žåã«ãåé·ã§æéããããããšããããŸããåæšè«ã¯ãã³ã³ãã€ã©ããžã§ããªãã¯ã³ãŒãã«æž¡ãããåŒæ°ã«åºã¥ããŠåãã©ã¡ãŒã¿ãæšæž¬ã§ããããã«ããããšã§ããã®å®åçãªã³ãŒããæé€ããŸãã
ãžã§ããªãã¯åæšè«ã®å©ç¹
- å®åã³ãŒãã®åæžïŒæç€ºçãªå泚éã®å¿ èŠæ§ãæžããããã¯ãªãŒã³ã§ç°¡æœãªã³ãŒãã«ãªããŸãã
- å¯èªæ§ã®åäžïŒã³ã³ãã€ã©ãå解決ãåŠçãããããããã°ã©ãã¯ããžãã¯ã«éäžã§ããã³ãŒãã®çè§£ã容æã«ãªããŸãã
- åå®å šæ§ã®åäžïŒã³ã³ãã€ã©ã¯åŒãç¶ãåãã§ãã¯ãå®è¡ããæšæž¬ãããåãæåŸ ãããåãšäžèŽããŠããããšã確èªããŸããããã«ãããå®è¡æã§ã¯ãªãã³ã³ãã€ã«æã«æœåšçãªåãšã©ãŒãæ€åºã§ããŸãã
- ã³ãŒãåå©çšæ§ã®åäžïŒãžã§ããªã¯ã¹ãšåæšè«ãçµã¿åãããããšã§ãããŸããŸãªããŒã¿åã§æ©èœããåå©çšå¯èœãªã³ã³ããŒãã³ããäœæã§ããŸãã
ãžã§ããªãã¯åæšè«ã®ä»çµã¿
ãžã§ããªãã¯åæšè«ã«äœ¿çšãããå ·äœçãªã¢ã«ãŽãªãºã ãšææ³ã¯ãããã°ã©ãã³ã°èšèªã«ãã£ãŠç°ãªããŸããããããäžè¬çãªååã¯åããŸãŸã§ããã³ã³ãã€ã©ã¯ããžã§ããªãã¯ã¯ã©ã¹ãŸãã¯ã¡ãœããã䜿çšãããŠããã³ã³ããã¹ããåæããæ¬¡ã®æ å ±ã«åºã¥ããŠåãã©ã¡ãŒã¿ãæšæž¬ããããšããŸãã
- æž¡ãããåŒæ°ïŒãžã§ããªãã¯ã¡ãœãããŸãã¯ã³ã³ã¹ãã©ã¯ã¿ã«æž¡ãããåŒæ°ã®åã
- æ»ãå€ã®åïŒãžã§ããªãã¯ã¡ãœããã®æåŸ ãããæ»ãå€ã®åã
- ä»£å ¥ã³ã³ããã¹ãïŒãžã§ããªãã¯ã¡ãœããã®çµæãä»£å ¥ããã倿°ã®åã
- å¶çŽïŒåãã©ã¡ãŒã¿ã«èª²ããããå¶çŽïŒäžéãã€ã³ã¿ãŒãã§ãŒã¹å®è£ ãªã©ïŒã
ã³ã³ãã€ã©ã¯ãããã®æ å ±ã䜿çšããŠäžé£ã®å¶çŽãæ§ç¯ãããããã®å¶çŽããã¹ãŠæºããæãå ·äœçãªåãæ±ºå®ããããã«ãããã®å¶çŽã解決ããããšããŸããã³ã³ãã€ã©ãåãã©ã¡ãŒã¿ãäžæã«æ±ºå®ã§ããªãå ŽåããŸãã¯æšæž¬ãããåãå¶çŽãšäžèŽããªãå Žåãã³ã³ãã€ã«æãšã©ãŒãçºè¡ãããŸãã
ããã°ã©ãã³ã°èšèªéã®äŸ
ããã€ãã®äººæ°ã®ããããã°ã©ãã³ã°èšèªã§ãžã§ããªãã¯åæšè«ãã©ã®ããã«å®è£ ãããŠããããèŠãŠã¿ãŸãããã
Java
Javaã¯Java 5ã§ãžã§ããªã¯ã¹ãå°å ¥ããJava 7ã§åæšè«ã匷åãããŸãããæ¬¡ã®äŸãæ€èšããŠãã ããã
List<String> names = new ArrayList<>(); // Java 7以éã®åæšè«
names.add("Alice");
names.add("Bob");
// ãžã§ããªãã¯ã¡ãœããã®äŸ:
public <T> T identity(T value) {
return value;
}
String result = identity("Hello"); // åæšè«: T 㯠String
Integer number = identity(123); // åæšè«: T 㯠Integer
æåã®äŸã§ã¯ããã€ã€ã¢ã³ãæŒç®å <> ã«ããã倿°å®£èšã«åºã¥ã㊠ArrayList ã List<String> ã§ããããšãã³ã³ãã€ã©ãæšæž¬ã§ããŸãã2çªç®ã®äŸã§ã¯ãidentity ã¡ãœããã®åãã©ã¡ãŒã¿ T ã®åã¯ãã¡ãœããã«æž¡ãããåŒæ°ã«åºã¥ããŠæšæž¬ãããŸãã
C++
C++ã¯ãžã§ããªãã¯ããã°ã©ãã³ã°ã«ãã³ãã¬ãŒãã䜿çšããŸããC++ã«ã¯JavaãC#ã®ãããªæç€ºçãªãåæšè«ãã¯ãããŸãããããã³ãã¬ãŒãåŒæ°æšè«ã¯åæ§ã®æ©èœãæäŸããŸãã
template <typename T>
T identity(T value) {
return value;
}
int main() {
auto result = identity(42); // ãã³ãã¬ãŒãåŒæ°æšè«: T 㯠int
auto message = identity("C++ Template"); // ãã³ãã¬ãŒãåŒæ°æšè«: T 㯠const char*
return 0;
}
ãã®C++ã®äŸã§ã¯ãC++11ã§å°å
¥ããã auto ããŒã¯ãŒããšãã³ãã¬ãŒãåŒæ°æšè«ãçµã¿åãããããšã§ãidentity ãã³ãã¬ãŒã颿°ã®æ»ãå€ã®åã«åºã¥ã㊠result ããã³ message 倿°ã®åãã³ã³ãã€ã©ãæšæž¬ã§ããŸãã
TypeScript
JavaScriptã®ã¹ãŒããŒã»ããã§ããTypeScriptã¯ããžã§ããªã¯ã¹ãšåæšè«ã匷åã«ãµããŒãããŠããŸãã
function identity<T>(value: T): T {
return value;
}
let result = identity("TypeScript"); // åæšè«: T 㯠string
let number = identity(100); // åæšè«: T 㯠number
// ãžã§ããªãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®äŸ:
interface Box<T> {
value: T;
}
let box: Box<string> = { value: "Inferred String" }; // æç€ºçãªå泚éã¯äžèŠ
TypeScriptã®åã·ã¹ãã ã¯ãåæšè«ã«ãããŠç¹ã«åŒ·åã§ããäžèšã®äŸã§ã¯ãidentity 颿°ã«æž¡ãããåŒæ°ã«åºã¥ã㊠result ããã³ number ã®åãæ£ããæšæž¬ãããŠããŸããBox ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãåæšè«ããžã§ããªãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã§ã©ã®ããã«æ©èœãããã瀺ããã®ã§ããããŸãã
C#
C#ã®ãžã§ããªã¯ã¹ãšåæšè«ã¯Javaã«äŒŒãŠãããæéã®çµéãšãšãã«æ¹åãããŠããŸãã
using System.Collections.Generic;
public class Example {
public static void Main(string[] args) {
List<string> names = new List<>(); // åæšè«
names.Add("Charlie");
// ãžã§ããªãã¯ã¡ãœããã®äŸ:
string message = GenericMethod("C# Generic"); // åæšè«
int value = GenericMethod(55);
System.Console.WriteLine(message + " " + value);
}
public static T GenericMethod<T>(T input) {
return input;
}
}
List<string> names = new List<>(); ãšããè¡ã¯ãJavaãšåããã€ã€ã¢ã³ãæŒç®åæ§æã䜿çšããåæšè«ã瀺ããŠããŸããGenericMethod ã¯ãã¡ãœããã«æž¡ãããåŒæ°ã«åºã¥ããŠã³ã³ãã€ã©ãåãã©ã¡ãŒã¿ T ãã©ã®ããã«æšæž¬ãããã瀺ããŠããŸãã
Kotlin
Kotlinã¯ãžã§ããªã¯ã¹ãšåæšè«ãéåžžã«ããŸããµããŒãããŠããããã°ãã°éåžžã«ç°¡æœãªã³ãŒãã«ã€ãªãããŸãã
fun <T> identity(value: T): T {
return value
}
val message = identity("Kotlin Generics") // åæšè«: T 㯠String
val number = identity(200) // åæšè«: T 㯠Int
// ãžã§ããªãã¯ãªã¹ãã®äŸ:
val numbers = listOf(1, 2, 3) // åæšè«: List<Int>
val strings = listOf("a", "b", "c") // åæšè«: List<String>
Kotlinã®åæšè«ã¯éåžžã«åŒ·åã§ããå€ã«åºã¥ããŠå€æ°ã®åãèªåçã«æšæž¬ããæç€ºçãªå泚éã®å¿ èŠæ§ãæžãããŸããäŸã¯ããžã§ããªãã¯é¢æ°ãšã³ã¬ã¯ã·ã§ã³ã§ã©ã®ããã«æ©èœãããã瀺ããŠããŸãã
Swift
Swiftã®åæšè«ã·ã¹ãã ã¯ãäžè¬çã«éåžžã«æŽç·ŽãããŠããŸãã
func identity<T>(value: T) -> T {
return value
}
let message = identity("Swift Type Inference") // åæšè«: String
let number = identity(300) // åæšè«: Int
// Arrayã®äŸ:
let intArray = [1, 2, 3] // åæšè«: [Int]
let stringArray = ["a", "b", "c"] // åæšè«: [String]
Swiftã¯ãäžèšã®äŸã§ç€ºãããŠããããã«ã倿°ãšã³ã¬ã¯ã·ã§ã³ã®åãã·ãŒã ã¬ã¹ã«æšæž¬ããŸããæç€ºçãªå宣èšã®éãæžããããšã§ãã¯ãªãŒã³ã§èªã¿ãããã³ãŒããå¯èœã«ããŸãã
Scala
Scalaã®åæšè«ãéåžžã«é«åºŠã§ãå¹ åºãã·ããªãªããµããŒãããŠããŸãã
def identity[T](value: T): T = value
val message = identity("Scala Generics") // åæšè«: String
val number = identity(400) // åæšè«: Int
// ãžã§ããªãã¯ãªã¹ãã®äŸ:
val numbers = List(1, 2, 3) // åæšè«: List[Int]
val strings = List("a", "b", "c") // åæšè«: List[String]
Scalaã®åã·ã¹ãã ã¯ã颿°åããã°ã©ãã³ã°æ©èœãšçµã¿åããã£ãŠãåæšè«ãåºç¯ã«æŽ»çšããŠããŸããäŸã¯ããžã§ããªãã¯é¢æ°ãšäžå€ãªã¹ãã§ã®äœ¿çšã瀺ããŠããŸãã
å¶éäºé ãšèæ ®äºé
ãžã§ããªãã¯åæšè«ã¯å€§ããªå©ç¹ãæäŸããŸãããå¶éããããŸãã
- è€éãªã·ããªãªïŒäžéšã®è€éãªã·ããªãªã§ã¯ãã³ã³ãã€ã©ãåãæ£ããæšæž¬ã§ããªãå Žåããããæç€ºçãªå泚éãå¿ èŠã«ãªããŸãã
- ææ§ãïŒã³ã³ãã€ã©ãåæšè«ããã»ã¹ã§ææ§ãã«ééããå Žåãã³ã³ãã€ã«æãšã©ãŒãçºè¡ãããŸãã
- ããã©ãŒãã³ã¹ïŒåæšè«ã¯éåžžãå®è¡æããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸããããå Žåã«ãã£ãŠã¯ã³ã³ãã€ã«æéãå¢å ãããå¯èœæ§ããããŸãã
ãããã®å¶éãçè§£ããåæšè«ãè³¢ã䜿çšããããšãéèŠã§ããçãããå Žåã¯ãæç€ºçãªå泚éã远å ããããšã§ãã³ãŒãã®æç¢ºããåäžããäºæããªãåäœãé²ãããšãã§ããŸãã
ãžã§ããªãã¯åæšè«ã®äœ¿çšã«é¢ãããã¹ããã©ã¯ãã£ã¹
- 説æçãªå€æ°åã䜿çšããïŒæå³ã®ãã倿°åã¯ãã³ã³ãã€ã©ãæ£ããåãæšæž¬ããã®ã«åœ¹ç«ã¡ãã³ãŒãã®å¯èªæ§ãåäžãããŸãã
- ã³ãŒããç°¡æœã«ä¿ã€ïŒã³ãŒãã®äžèŠãªè€éããé¿ããŠãã ãããããã¯åæšè«ãããå°é£ã«ããå¯èœæ§ããããŸãã
- å¿ èŠã«å¿ããŠæç€ºçãªå泚éã䜿çšããïŒã³ã³ãã€ã©ãåãæ£ããæšæž¬ã§ããªãå Žåããã³ãŒãã®æç¢ºããåäžãããå Žåã«ã¯ãæç€ºçãªå泚éã远å ããããšãèºèºããªãã§ãã ããã
- 培åºçã«ãã¹ãããïŒã³ã³ãã€ã©ã«ãã£ãŠæ€åºãããªãå¯èœæ§ã®ããæœåšçãªåãšã©ãŒãæ€åºããããã«ãã³ãŒãã培åºçã«ãã¹ããããŠããããšã確èªããŠãã ããã
颿°åããã°ã©ãã³ã°ã«ããããžã§ããªãã¯åæšè«
ãžã§ããªãã¯åæšè«ã¯ã颿°åããã°ã©ãã³ã°ãã©ãã€ã ã«ãããŠéèŠãªåœ¹å²ãæãããŸãã颿°åèšèªã¯ãäžå€ããŒã¿æ§é ãšé«é颿°ã«å€§ããäŸåããŠããããããã¯ãžã§ããªã¯ã¹ãšåæšè«ã«ãã£ãŠæäŸãããæè»æ§ãšåå®å šæ§ãã倧ããªæ©æµãåããŸããHaskellãScalaãªã©ã®èšèªã¯ããã®é¢æ°åæ§è³ªã®äžå¿ãšãªã匷åãªåæšè«æ©èœã瀺ããŠããŸãã
ããšãã°ãHaskellã§ã¯ãåã·ã¹ãã ã¯æç€ºçãªåã·ã°ããã£ãªãã§è€éãªåŒã®åãæšæž¬ã§ããããšãå€ããç°¡æœã§è¡šçŸåè±ããªã³ãŒããå¯èœã«ããŸãã
çµè«
ãžã§ããªãã¯åæšè«ã¯ãçŸä»£ã®ãœãããŠã§ã¢éçºã«ããã貎éãªããŒã«ã§ããã³ãŒããç°¡çŽ åããåå®å šæ§ãåäžãããã³ãŒãã®åå©çšæ§ãé«ããŸããåæšè«ãã©ã®ããã«æ©èœããããçè§£ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãéçºè ã¯ãã®å©ç¹ã掻çšããŠãããŸããŸãªããã°ã©ãã³ã°èšèªã«ããããããå ç¢ã§ä¿å®æ§ã®é«ããœãããŠã§ã¢ãäœæã§ããŸããããã°ã©ãã³ã°èšèªãé²åãç¶ããã«ã€ããŠãããã«æŽç·Žãããåæšè«ã¡ã«ããºã ãç»å Žããéçºããã»ã¹ãããã«ç°¡çŽ åãããœãããŠã§ã¢å šäœã®å質ãåäžãããããšãæåŸ ã§ããŸãã
èªåå解決ã®åãæŽ»çšããå管çã«é¢ããŠã¯ã³ã³ãã€ã©ã«éãäœæ¥ãä»»ããŸããããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ããžãã¯ã«éäžã§ããããå¹ççã§å¹æçãªãœãããŠã§ã¢éçºã«ã€ãªãããŸãã